package com.ipartek.formacion.pruebas;

import com.ipartek.formacion.beans.Persona;
import com.ipartek.formacion.excepciones.PersonaException;

/**
 * Clase de prueba para ver como se pasan los parametros por valor(primitivos) o
 * referencia
 * 
 * 
 */
public class PruebaPasaParametrosPorReferenciaOValor {

	/**
	 * 
	 * Incrementar un entero
	 * 
	 * @param incremento
	 *            a sumar al segundo parametro
	 * @param parametroValor
	 *            es el parametro al que le sumamos el incremento
	 * @return devuelve el valor incrementado
	 */
	private static int incrementar(int incremento, int parametroValor) {

		return parametroValor += incremento;
	}

	private static Persona incrementarPersona(int incremento, Persona p) {
		try {
			p.setEdad(p.getEdad() + incremento);
		} catch (PersonaException e) {
			if (e.getCodigoError() == PersonaException.COD_RANGO_EDAD_NO_VALIDO) {
				System.out.println("Edad de la persona no es correcta");
			}
		}
		return p;
	}

	public static void main(String[] args) {

		// Probar que los parametros primitivos se pasan por valor y no varian
		// mas que dentro del metodo incrementar
		int enteroPrimitivo = 0;

		System.out.println("Envio de parametro por valor");
		System.out.println("============================");
		int resultado = incrementar(1, enteroPrimitivo);
		System.out.println("enteroPrimitivo= " + enteroPrimitivo
				+ " y resultado= " + resultado + ".");
		System.out
				.println("Como se pasa la variable por valor, enteroPrimitivo no cambia");
		// Probar que los objetos se pasan por referencia y varian tanto
		// persona3 como persona1
		Persona persona1 = new Persona();
		try {
			persona1.setEdad(24);
		} catch (PersonaException e) {
			if (e.getCodigoError() == PersonaException.COD_RANGO_EDAD_NO_VALIDO) {
				System.out.println("Edad de la persona no es correcta");
			}
		}
		System.out.println("Envio de parametro por referencia");
		System.out.println("============================");
		Persona persona2 = incrementarPersona(1, persona1);
		System.out.println("La edad de persona1 es = " + persona1.getEdad()
				+ " y la de persona2 es= " + persona2.getEdad() + ".");
		// Probar que los objetos se pueden clonar para crear un nuevo objeto en
		// un espacio de memoria diferente y que el objeto original no cambie al
		// manipularlo en el metodo
		System.out.println("Envio de objeto clon");
		System.out.println("============================");
		// Al enviar persona1 realizamos un clon de este para no pasar persona1
		// por referencia y que de este modo persona1 cambie. Por lo tanto, se
		// crea un clon y se manda este por referencia
		Persona persona3 = incrementarPersona(1, (Persona) persona1.clone());
		System.out.println("La edad de persona1 es = " + persona1.getEdad()
				+ " y la de persona3 es= " + persona3.getEdad() + ".");

	}
}
